package com.unittec.zk.provider.utils;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import com.unittec.zk.provider.scope.ThreadLocalScope;
import org.springframework.core.ParameterizedTypeReference;

import com.unittec.zk.provider.ApplicationContextProvider;
import com.unittec.zk.provider.common.Md5;
import com.unittec.zk.provider.common.ServiceIdConstants;
import com.unittec.zk.provider.service.HystrixRestTemplateService;
import com.unittec.zk.sdk.auth.request.Req101617;
import com.unittec.zk.sdk.auth.response.Res101617;
import com.unittec.zk.sdk.root.common.CommonConstant;
import com.unittec.zk.sdk.root.common.FieldConstants;
import com.unittec.zk.sdk.root.domain.GatewayRequest;
import com.unittec.zk.sdk.root.domain.Result;

/**
 * @author wuxinwei
 */
public class BoxNoChecker {

    private static final Map<String, Integer> mapOfCode = new HashMap<>(32);

    static {
        mapOfCode.put("A", 10);
        mapOfCode.put("B", 12);
        mapOfCode.put("C", 13);
        mapOfCode.put("D", 14);
        mapOfCode.put("E", 15);
        mapOfCode.put("F", 16);
        mapOfCode.put("G", 17);
        mapOfCode.put("H", 18);
        mapOfCode.put("I", 19);
        mapOfCode.put("J", 20);
        mapOfCode.put("K", 21);
        mapOfCode.put("L", 23);
        mapOfCode.put("M", 24);
        mapOfCode.put("N", 25);
        mapOfCode.put("O", 26);
        mapOfCode.put("P", 27);
        mapOfCode.put("Q", 28);
        mapOfCode.put("R", 29);
        mapOfCode.put("S", 30);
        mapOfCode.put("T", 31);

        mapOfCode.put("U", 32);
        mapOfCode.put("V", 34);
        mapOfCode.put("W", 35);
        mapOfCode.put("X", 36);
        mapOfCode.put("Y", 37);
        mapOfCode.put("Z", 38);
    }

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {

        String ss = "TBBU5096640";
        String s2 = "CNTU0001329";

        getBoxNo("ZKKJ", 10);

        // System.out.println(checkDigit("CUUB7252292"));

    }

    /**
     * 获取集装箱校验开关
     */
    private static boolean getBoxNoCheckSwitch() {

        HystrixRestTemplateService hystrixRestTemplateService =
            ApplicationContextProvider.getBean(HystrixRestTemplateService.class);

        GatewayRequest<Req101617> getWay = new GatewayRequest<>();
        Req101617 req101617 = new Req101617();
        req101617.setDicCode("box_no_checker");
        getWay.setContent(req101617);
        getWay.setMethod("101617");
        Result<Res101617> result = hystrixRestTemplateService.exchange(Md5.getMd5(FieldConstants.SYS_REQUEST_SOURCE_ID),
            ServiceIdConstants.AUTH_101617, getWay, ThreadLocalScope.getAuthData(),
            new ParameterizedTypeReference<Result<Res101617>>() {});
        if (!result.isSuccess()) {
            return false;
        }
        if (result.getData() == null) {
            return false;
        } else {
            if (result.getData().getObj() != null && result.getData().getObj().get(0) != null) {
                return "1".equalsIgnoreCase(result.getData().getObj().get(0).getItemValue());
            } else {
                return false;
            }
        }

    }

    /**
     * 随机获取箱号
     *
     * @param per
     * @param num
     * @return
     */
    private static void getBoxNo(String per, int num) {

        for (int i = 0; i < num; i++) {
            Random random = new Random();
            int no = random.nextInt(9999999);
            String str = String.format("%07d", no);

            int checkNo = getCheckNum(per + str);
            System.out.println(per + str.substring(0, str.length() - 1) + checkNo);

        }

    }

    /**
     * 获取校验码
     *
     * @param containerNumber
     * @return
     */
    private static int getCheckNum(String containerNumber) {
        int positon = 1;
        int sum = 0;
        for (int i = 0; i < containerNumber.length() - 1; i++) {
            if (mapOfCode.containsKey(containerNumber.substring(i, i + 1))) {
                sum += Double.valueOf(mapOfCode.get(containerNumber.substring(i, i + 1))) * Math.pow(2, positon - 1);
            } else {
                sum += Double.valueOf(containerNumber.substring(i, i + 1)) * Math.pow(2, positon - 1);
            }
            positon++;
        }
        int checkdigit = sum % 11 % 10;

        return checkdigit;
    }

    /**
     * 校验集装箱编号
     *
     * @param containerNumber
     * @return
     * @throws Exception
     */
    public static boolean checkDigit(String containerNumber) {

        try {
            if (!getBoxNoCheckSwitch()) {
                return true;
            }
        } catch (Exception e) {
            // 异常后不校验箱号
            e.printStackTrace();
        }

        try {
            if (containerNumber == null || containerNumber.trim().length() != CommonConstant.SIZE_11) {
                // throw new Exception("Not a container number");
                return false;
            }
            int checkdigit = getCheckNum(containerNumber);
            /*        System.out.println("check container number:"
                + containerNumber
                + ";get check digit is "
                + checkdigit
                + ";origin check digit is "
                + containerNumber.substring(containerNumber.length() - 1,
                containerNumber.length()));*/
            return checkdigit == Integer.parseInt(containerNumber.substring(containerNumber.length() - 1));
        } catch (NumberFormatException e) {

            return false;
        }
    }

}
